iT邦幫忙

2022 iThome 鐵人賽

DAY 3
2
Modern Web

Have fun! 新手也能打造的Javascript微型專案系列 第 3

Have fun! 新手也能打造的Javascript微型專案! Day3: 寫個Chrome Extension快速刪除瀏覽器紀錄吧!

  • 分享至 

  • xImage
  •  

前言

我們今天繼續Chrome Extension系列,這玩意真的是低投入高回報的東西,我還記得第一次寫的擴充套件陪我耍廢了好久? 就算不發布也可以直接分享給朋友讓他們在自己的電腦上使用,今天的主題是瀏覽器紀錄清除,相信在立即死亡與公開自己的瀏覽器紀錄兩者之間,許多人應該會選擇立即死亡吧!但清除瀏覽記錄其實需要的操作還不少,不如寫個小套件一鍵清除吧!

我選擇死亡

預期成果

我們今天要做的東西需要隱密一點,偷偷刪除掉指定區間的紀錄不留下任何證據,如以下的預覽圖一樣,連完成的提示都不給?

clear history demo

Getting started

Step 1: 專案結構

相信經過前兩天的練習,開始的步驟你應該相當熟練了,但別急,這次稍微有些不同。
新建資料夾後,雖然我們一樣需要manifest.json檔案、一樣需要一個icon圖,不過在這個專案中我們並不需要一直在背景監聽事件或執行函式,因此不會需要background.js,取而代之我們需要以下的檔案。

icon

  • content.js (命名隨意,我只是照我以前的習慣)
  • popup.html
  • style.css

是的,就是傳統的前端三元素,這次的套件中我們要依賴這三者的組合達成我們要的效果。
完成後你的專案結構應該是這樣的,新增的檔案都先留空沒有關係。
folder structure

Step 2: 修改manifest.json

請在manifest.json中寫入以下的內容,特別注意這次我們不需要background的屬性,取而代之的是我們要將之前留空的action屬性填入一些東西。

{
  "name": "Clear Your History",
  "description": "Clear your broswer history with one simple click!",
  "version": "1.0.0",
  "manifest_version": 3,
  "action": {
    "default_title": "Click to clear your history",
    "default_popup": "popup.html"
  },
  "icons": {
    "16": "./32x32.png",
    "32": "./32x32.png",
    "48": "./32x32.png",
    "128": "./32x32.png"
  },
  "permissions": ["history"]
}

介紹一下這次的重點, action屬性裡面新增的東西

  • default_title: 當你滑鼠hover到icon時顯示的名稱,若沒有提供的話則以套件名稱為預設值。
  • default_popup: 若提供此屬性,則點擊icon時會跳出一個popup,popup的內容則會在根目錄尋找你提供的html檔案名稱。

你或許已經猜到了,新增的style.css & content.js就是要用在等等要寫的popup.html裡面,不用把它想得太複雜,這popup就是一個小小但完整的網頁!

Step 3: 修改popup.html

請在popup.html中寫入以下的內容,是一個非常簡單的結構,除了標題之外我們需要一個下拉選單與一個按鈕做提交,同時我們在這裏預先載入等等要編輯的js & css檔案。

<!DOCTYPE html>
<html lang="en">
  <head>
    <link rel="stylesheet" href="./style.css" />
    <script src="./content.js" defer></script>
  </head>
  <body>
    <div class="container">
      <div class="title">Delete History</div>
      <select name="timeRange" id="timeRange">
        <option value="1" selected>Within 1 hour</option>
        <option value="6">Within 6 hours</option>
        <option value="12">Within 12 hours</option>
        <option value="24">Within 24 hours</option>
        <option value="all">All</option>
      </select>
      <button class="btn">Confirm</button>
    </div>
  </body>
</html>

注意我們在這邊option除了先寫入value之外,我們還要在其中一個選項加入selected屬性,避免使用者傳空值。

Step 4: 修改style.css

雖然不必要,但我會建議稍微做一點樣式,免得整個popup看起來太過於悲慘,請你將以下的程式碼寫入style.css檔案

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

.container {
  padding: 0.5em 0.75em;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: space-between;
  height: 100px;
  background: #f3e2c7;
}

.title {
  font-size: 1em;
  font-weight: bold;
}

select[name="timeRange"] {
  background: transparent;
}

.btn {
  padding: 0.25em 0.5em;
  font-size: 0.75em;
}

Step 5: 修改content.js

終於到了最後一步,處理邏輯前我們一樣先釐清我們到底要做什麼.

點擊icon跳出popup的部分已經由extension本身替我們處理了,下一步我們希望點擊提交按鈕時刪除我們指定區間的歷史紀錄,而根據官方文件的說法,它有刪除區間以及刪除全部紀錄的方法讓我們使用,因此在處理時我們需要根據剛剛在html檔案寫的select元素數值去做到底要呼叫哪個方法的判斷.

這麼一來我們要做的事情就很簡單了,我們知道會需要在按鈕上掛上一個監聽器,接著這個監聽器以我們寫的函數作為handler,函數需要傳入select元素的值做為參數,這樣我們才有辦法知道要呼叫哪個google提供方法去刪除紀錄!

比較需要注意的有幾點

  • 我們從select元素拿到的值一定是字串,在做計算前要先轉為數字
  • deleteRange函數需要傳入他指定的物件,其中要包含endTime & startTime,這個時間的值需要以毫秒來表示epoch time,也就是從UTC1970年1月1日0時0分0秒起至現在的總秒數,我們在js中可以透過Date.now()取得這個數字.
  • 計算startTime時,一小時為60 * 60 * 1000毫秒
  • 在刪除紀錄後,我們需要呼叫window.close()方法去關閉整個popup,不要忘了我們剛剛有提到過,他雖小但仍是一個網頁,原生的方法都是可以用的!
const button = document.querySelector(".btn");
const timeRangeSelect = document.querySelector("#timeRange");

const deleteHistory = (timeRange) => {
  // 優先處理delete all的情況
  if (timeRange === "all") return chrome.history.deleteAll();

  // deleteRange函數需要傳入一個含有endTime & startTime的物件,而時間需要以毫秒(milliseconds)表示epoch time
  return chrome.history.deleteRange({
    endTime: Date.now(),
    startTime: Date.now() - Number(timeRange) * 60 * 60 * 1000,
  });
};

button.addEventListener("click", () => {
  deleteHistory(timeRangeSelect.value);
  window.close();
});

Step 6: 載入並實際使用擴充套件

懶得重複了,忘記的朋友請自己去看第一天的文章,我不兇,我只是懶。

總結

今天我們利用了chrome.history提供的方法寫了一個簡單的刪除紀錄擴充套件,主要的目光集中在popup的使用,有許多常見的套件都有這樣的彈出式窗口設計,現在你也知道那些套件的基本是怎麼做的囉!比想像中簡單對吧?

文章中的範例程式碼可以在這邊取得,歡迎自行取用

轉職Q & A

Danny, 我看了看你說的那些課程,也了解了薪資的部分,我很想要這樣穩定的薪水但我覺得我好像對寫程式沒有熱情,這樣我是不是不該當工程師啊?

uhhh..又來了,我不太喜歡把這個職業跟錢綁得太緊,但事實就是很多人都是因為薪水相對優渥才會動了轉職的念頭,這類的問題坦白講很難避免,我還是說一說我的看法吧!

先從結論說起,我不認為你需要熱情才能成為一個合格的工程師,雖然我自己很喜歡寫code,但與此同時我也並不覺得對於工作一定要有熱情,當然對自己的工作有熱枕是件好事,但你可以對生活的很多事情有熱情,然後把工作當作生活下去的必須行為而已,為了錢而工作...說實在我個人覺得這並沒有什麼不對,不過在此之前你當然需要具備能做好你工作的能力?

至於你打算爬到多高的位置則是完全看你個人,更高的位置沒有熱情去支撐自己不斷地進修的話我想是很困難的,不過每個人目標並不同,僅追求混口飯吃的話是肯定沒有問題的,人生還有許多有趣的事情,你不見得需要把工作當作你的重心!

本文章同步發布於個人部落格,有興趣的朋友也可以來逛逛~!


上一篇
Have fun! 新手也能打造的Javascript微型專案! Day2: 寫個Chrome Extension讓你在文字顏色遊戲中戰無不勝吧!
下一篇
Have fun! 新手也能打造的Javascript微型專案! Day4: 寫個Chrome Extension定期發送通知,讓你養成喝水的好習慣吧!
系列文
Have fun! 新手也能打造的Javascript微型專案30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

2
Charlie
iT邦新手 5 級 ‧ 2022-09-16 12:31:32

非常人性的功能www

我要留言

立即登入留言